home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
- /* bones.c - version 1.0.3 */
-
- #include "hack.h"
- extern char plname[PL_NSIZ];
- extern long somegold();
- extern struct monst *makemon();
-
- /* objects have letter " % ) ( 0 _ ` [ ! ? / = * */
- #ifdef DGK
- static char uncurseable[] = "%*";
- char bones[FILENAME];
- #else
- char bones[] = "bones_xx";
- #endif DGK
-
- /* save bones and possessions of a deceased adventurer */
- savebones(){
- register fd;
- register struct obj *otmp;
- register struct trap *ttmp;
- register struct monst *mtmp;
- if(dlevel <= 0 || dlevel > MAXLEVEL) return;
- if(!rn2(1 + (dlevel>>1))) return; /* not so many ghosts on low levels */
- #ifdef DGK
- name_file(bones, dlevel);
- #else
- bones[6] = '0' + (dlevel/10);
- bones[7] = '0' + (dlevel%10);
- #endif DGK
- #ifdef TOS
- if((fd = open(bones,0x8000)) >= 0){ /*no translate*/
- #else
- if((fd = open(bones,0)) >= 0){
- #endif TOS
- (void) close(fd);
- return;
- }
- /* drop everything; the corpse's possessions are usually cursed */
- otmp = invent;
- while(otmp){
- otmp->ox = u.ux;
- otmp->oy = u.uy;
- otmp->age = 0; /* very long ago */
- otmp->owornmask = 0;
- #ifdef DGK
- /* Some objects should not be curseable -dgk */
- if(!index(uncurseable, otmp->olet) && rn2(5)) otmp->cursed = 1;
- #else
- if(rn2(5)) otmp->cursed = 1;
- #endif DGK
- if(!otmp->nobj){
- otmp->nobj = fobj;
- fobj = invent;
- invent = 0; /* superfluous */
- break;
- }
- otmp = otmp->nobj;
- }
- if(!(mtmp = makemon(PM_GHOST, u.ux, u.uy))) return;
- mtmp->mx = u.ux;
- mtmp->my = u.uy;
- mtmp->msleep = 1;
- (void) strcpy((char *) mtmp->mextra, plname);
- mkgold(somegold() + d(dlevel,30), u.ux, u.uy);
- for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){
- mtmp->m_id = 0;
- if(mtmp->mtame) {
- mtmp->mtame = 0;
- mtmp->mpeaceful = 0;
- }
- mtmp->mlstmv = 0;
- if(mtmp->mdispl) unpmon(mtmp);
- }
- for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
- ttmp->tseen = 0;
- for(otmp = fobj; otmp; otmp = otmp->nobj) {
- otmp->o_id = 0;
- /* otmp->o_cnt_id = 0; - superfluous */
- otmp->onamelth = 0;
- otmp->known = 0;
- otmp->invlet = 0;
- if(otmp->olet == AMULET_SYM && !otmp->spe) {
- otmp->spe = -1; /* no longer the actual amulet */
- otmp->cursed = 1; /* flag as gotten from a ghost */
- }
- }
- if((fd = creat(bones, FMASK)) < 0) return;
- savelev(fd,dlevel);
- (void) close(fd);
- }
-
- getbones(){
- register fd,x,y,ok;
- if(rn2(3)) return(0); /* only once in three times do we find bones */
- #ifdef DGK
- name_file(bones, dlevel);
- #else
- bones[6] = '0' + (dlevel/10);
- bones[7] = '0' + (dlevel%10);
- #endif DGK
- #ifdef TOS
- if((fd = open(bones, 0x8000)) < 0) return(0);
- #else
- if((fd = open(bones, 0)) < 0) return(0);
- #endif
- if((ok = uptodate(fd)) != 0){
- getlev(fd, 0, dlevel);
- for(x = 0; x < COLNO; x++) for(y = 0; y < ROWNO; y++)
- levl[x][y].seen = levl[x][y].new = 0;
- }
- (void) close(fd);
- #ifdef WIZARD
- if(!wizard) /* duvel!frans: don't remove bones while debugging */
- #endif WiZARD
- if(unlink(bones) < 0){
- pline("Cannot unlink %s .", bones);
- return(0);
- }
- return(ok);
- }
-